//
//  PlayMusic.m
//  音乐播放器
//
//  Created by dllo on 16/3/19.
//  Copyright © 2016年 JokesTeam. All rights reserved.
//

#import "PlayMusic.h"
#import <AVFoundation/AVFoundation.h>

@interface PlayMusic ()

@property (nonatomic, retain) AVPlayer *avPlayer; // 申明系统播放器属性

@property (nonatomic, retain) NSTimer *timer; //定时器(让它在开始时候开始，暂停时候停止)
@property (nonatomic, assign) CGFloat musicDuration; // 要播放的音乐时长

//@property (nonatomic, copy) void(^blockPlayTime)(CGFloat); // 该block实现计算播放时间

@end

@implementation PlayMusic

- (instancetype)init {
    self = [super init];
    if (self) {
        
    }
    return self;
}

/**
 *  音乐播放器单例
 *
 *  @return play本类对象
 */
+ (PlayMusic *)shareMusic {
    static PlayMusic *play = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        play = [[PlayMusic alloc] init];
        play.avPlayer = [[AVPlayer alloc] init]; // 初始化系统播放器
        
        // 因为每次程序运行时 我只需一次向本地获取用户自定义设置的音量，这样可避免重复向本地获取数据
        [play createPlayVolume];
    });
    
    // 调用该方法设置当前音量显示
//    [play.delegate createMusicVolume:play.avPlayer.volume];
    
    return play;
}

/**
 *  播放音乐
 *
 *  @param avUrl 音乐加载接口
 */
- (void)playMusicWithAvUrl:(NSString *)avUrl musicDuration:(CGFloat)duration {
    // 确保程序安全运行
    if (!avUrl) {
        return;
    }
    
    if (self.avPlayer.currentItem) {
        [self.avPlayer.currentItem removeObserver:self forKeyPath:@"playMusic"];
    }
    
    // 磁盘(磁带：播放地址 放入磁盘)
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:avUrl]];
    // 监听音乐播放状态
    [item addObserver:self forKeyPath:@"playMusic" options:NSKeyValueObservingOptionNew context:nil];
    
    // 添加磁盘到音乐播放器
    [self.avPlayer replaceCurrentItemWithPlayerItem:item];

    // 给音乐时长赋值
    _musicDuration = duration;
}

/**
 *  开始播放音乐
 */
- (void)startPlay {
    [self.avPlayer play];
    
    // 判断（安全）
    if (!self.timer) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    }
    
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];//将定时器加入runloop中，（我们可以理解为:闭合的回路，让它一直执行这个方法）//现在我们在滑动视图的时候，图片就还在旋转,滑竿就还在滑动.
    //主线程默认开启，子线程默认关闭的
    
}

/**
 *  暂停播放音乐
 */
- (void)pausePlay {
    [self.avPlayer pause];
    
    if (self.timer) {
        [self.timer invalidate]; // 定时器销毁
        self.timer = nil; // 把这个空间释放，指回空
    }
}

/**
 *  某一时刻开始播放
 *
 *  @param time 从什么时候开始播放
 */
- (void)seekToTime:(CGFloat)time {
    
    // 保证安全
    if (self.timer) {
        [self.timer invalidate]; // 定时器销毁
        self.timer = nil; // 把这个空间释放，指回空
    }
    
    // 某一时间，播放的进度（可以理解为:第一个参数为当前时间 乘 第二个参数每一秒走多少进度 = 进度）
    [self.avPlayer seekToTime:CMTimeMakeWithSeconds(time, self.avPlayer.currentTime.timescale) completionHandler:^(BOOL finished) {
        if (finished) {
            [self startPlay];
        }
    }];
}


// 计算当前播放时间
- (CGFloat)playTime {
    
    // 计算当前播放了多少秒
    CGFloat time = _avPlayer.currentTime.value / _avPlayer.currentTime.timescale;
    
    // 当播放结束时
    if (time >= _musicDuration - 1) {
        // 保证安全
        if (self.timer) {
            [self.timer invalidate]; // 定时器销毁
            self.timer = nil; // 把这个空间释放，指回空
        }
    }
    
    return time;
}

// timer的方法
- (void)timerAction:(NSTimer *)timer {
    
    CGFloat time = [self playTime];
    
    NSLog(@"%f", time);
    [self.delegate playTime:time];
    
}



// 重写volume set方法
- (void)setVolume:(CGFloat)volume {
    self.avPlayer.volume = volume;
    
    NSString *str = [NSString stringWithFormat:@"%f", volume];

    NSDictionary *dic = @{@"volume":str};
    [self saveColorDicToLocal:dic keys:@"volume"];
}

// 重写volume get方法
- (CGFloat)volume {
    return self.avPlayer.volume;
}


// 保存volume (存储当前用户设置音量)
- (void)saveColorDicToLocal:(NSDictionary *)dic keys:(NSString *)key {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    [defaults setObject:dic forKey:key];
}

// 获取vlume (获取用户上次使用设置音量)
- (NSDictionary *)getColorDicFromLocal:(NSString *)key {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSDictionary *dic = [defaults objectForKey:key];
    return dic;
}

// 本地是否用户自定义音量
- (BOOL)localHaveColorDic:(NSString *)key {
    
    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults];
    
    NSDictionary *dic = [preferences objectForKey:key];
    
    if (dic) {
        return YES;
    }
    return NO;
}

/**
 *  设置播放音量
 *
 *  @return 当前音量值
 */
- (CGFloat)createPlayVolume {
    BOOL isSelfVolume = [self localHaveColorDic:@"volume"];
    /**
     *  如果用户自定义了音量 则启用用户自定义音量 否则为系统默认
     */
    if (isSelfVolume) {
        NSDictionary *dic = [self getColorDicFromLocal:@"volume"];
        CGFloat volume = [dic[@"volume"] floatValue];;
        self.avPlayer.volume = volume;
    } else {
        self.avPlayer.volume = 5;
    }
    
    return self.avPlayer.volume;
}


@end
